<?php
final class Mozg
{
	static private $_user;
	
    private function __construct (){}

    /**
		объект запроса
     */
    static public function Request($protName)
    {
        return Mozg_Request_Collection::Get($protName);
    }
    
    /**
		объект ответа
     */
    static public function Response($protName)
    {
        return Mozg_Response_Collection::Get($protName);
    }
    
    static public function Router($protName)
    {
    	return Mozg_Router::Get($protName);
    }
    
    /**
		объект активного юзера
     */
    static public function User(Mozg_Property_Params $user = null, $reset = false)
    {
    	if ($user || $reset)
    	{
    		self::$_user = $user;
    	}
    	
    	if (!self::$_user)
    	{
    		self::$_user = Mozg_Entity::Get('entity/user');
    	}
    	
    	return self::$_user;
    }

    /**
		создаёт объект модуля
     */
    static public function Module($moduleName, $protName = false, $envName = false)
    {
    	return Mozg_Module::Get($moduleName, $protName, $envName);
    }
    
    /**
		создаёт объект контроллера
     */
    static public function Ctrl($moduleName, $ctrlName = false, $protName = false, $envName = false)
    {
    	return Mozg_Controller::Get($moduleName, $ctrlName, $protName, $envName);
    }

    /**
		создаёт объект библиотеки
     */
    static public function Lib($libName)
    {
        return Mozg_Collection_Libs::GetInstance()->$libName;
    }

    /**
		создаёт и возвращает декоратор
     */
    static public function Layout($moduleName)
    {
        return Mozg_Collection_Layouts::GetInstance()->$moduleName;
    }
    
    static public function Tpl($name = false, $moduleName = false, $ctrlName = false, $detector = null)
    {
    	if (!strlen($name)) $name = 'Base';
    	$className = 'App' .(false != $moduleName ? '_Module_' .$moduleName : '').(false != $ctrlName ? '_Component_' .$ctrlName : ''). '_Tpl_' .$name;
        
    	if (!class_exists($className)) throw new Mozg_Exception_NotFound('Template ' .$name. '::' .$moduleName. '::' .$ctrlName. ' not found');
    	
    	return new $className($detector);
    }

    static public function SubAction()
    {
    	return Mozg_Subactions::GetInstance();
    }

    static public function ExceptionHandler($moduleName, $protName = false, $envName = false)
    {
        $ctrlClassNameEnv = 'App_Module_' .$moduleName. '_ExceptionHandler_' .$protName. '_' .$envName;
        if (!class_exists($ctrlClassNameEnv))
        {
        	$ctrlClassNameEnv = 'App_Module_' .$moduleName. '_ExceptionHandler_' .$protName;
        	if (!class_exists($ctrlClassNameEnv))
        	{
        		$ctrlClassNameEnv = 'App_Module_' .$moduleName. '_ExceptionHandler_Base';
        		if (!class_exists($ctrlClassNameEnv))
        		{
        			$ctrlClassNameEnv = 'Mozg_ExceptionHandler';
        		}
        	}
        }

        return new $ctrlClassNameEnv($protName, $envName);
    }
}